#include <iostream>
#include <vector>
#include "BinarySearchTree.h"
#include "BSTSorting.h"
#include <ctime>


int main()
{
  vector<int> input;
  int _mode;
  int size_arr=0;
  int flag;
  clock_t begin, end;
  int condition = 0;  //想要测试的情况
  int shuchu = 0;
  int element;
  
 FLAG:
  flag =0; //用于重复测试的标志

  begin = 0;
  end = 0;

  


      //选择测试的情况
      std::cout << "\n请输入想要测试的情况。\n 0 为随机生成的测试数组，代表普遍情况, 1 为最坏的情况. 2 为自定义数组 " << std::endl;
      std::cin >> condition;
      if(condition != 1 && condition != 0 && condition != 2){
	std::cout << "输入的数字不合法。默认测试普通情况\n" << std::endl;
	condition = 0;
      }
      
      /*其实感觉用一个switch更符合逻辑一点，但是自定义功能是最后加的，懒得改代码了。*/

      
      //两种情况的数组生成
      if( condition==1 ){
      
      std::cout << "输入数组的长度。请勿输入整数以外的数据！" << std::endl;
      std::cin >> size_arr;
	while(size_arr--){
	input.push_back( size_arr );
	
	}
	
      }else if( condition == 0){
      
      std::cout << "输入数组的长度。请勿输入整数以外的数据！" << std::endl;
      std::cin >> size_arr;
	while(size_arr--){
	  input.push_back( rand() % 9000 );
	  
	}
      }else{
	std::cout << "输入数组。请不要输入整数以外的数据！" << std::endl;
	while( 1 )
	  {
	    std::cin >> element;
	    input.push_back( element );
		if( getchar() == '\n')
		  break;
	  }

      }

      
      //选择排序模式
  std::cout << "\n请输入数据的排序模式。1表示需要打乱后再排序。0表示不需要打乱直接排序" << std::endl;
  std::cin >> _mode;
  if(_mode != 1 &&_mode != 0)
    {
      std::cout << "\n输入错误的数字。默认不需要打乱直接排序"<< std::endl;
      _mode = 0;
    }

  
  //排序，计时
  begin = clock();
  BSTSorting( input , _mode);
  end = clock();


  //输出排序后的数组（不是很需要，但是还是留在这了。证明排序是正确的）
  std::cout << "\n需要查看排序后的数组吗？需要输入1，不需要输入0" << std::endl;
  std::cin >> shuchu;
  if(shuchu != 1 && shuchu != 0){
    std::cout << "输错了，默认不给你看" << std::endl;
    shuchu = 0;
  }
  if(shuchu){
  std::cout << "排序后的数组为"<< std::endl;
  for( vector<int>::iterator itr = input.begin();
       itr != input.end();
       itr++)
    {
      std::cout << *itr << '\t';
    }
  std::cout << '\n';
  }
  
  std::cout << "time:"<< ( end - begin )<<'\n' << std::endl;

  input.clear();

  
  std::cout << "是否重新开始测试？如果是，请输入1.如果结束程序，请输入0." << std::endl;
  std::cin >> flag;
  if(flag == 1)
    {
      goto FLAG;
    }else if( flag != 0 )
    {
      std::cout << "输入数据错误，默认程序结束。" << std::endl;
    }
  std::cout<< "再见"<< std::endl;

  
  return 0;
}
